package com.dx.gate.util;

import com.dx.gate.server.ChatServerLauncher;
import com.dx.mobileimsdk.server.network.MBObserver;
import com.dx.mobileimsdk.server.protocal.Protocal;
import com.dx.mobileimsdk.server.protocal.ProtocalFactory;
import com.dx.mobileimsdk.server.utils.GlobalSendHelper;
import lombok.extern.slf4j.Slf4j;


/**
 * 服务端主动发出的或收到的消息处理辅助类（即消息发送模式为C2S或S2C的情况）.
 */
@Slf4j
public class MessageHelper {
    /**
     * 由服务端主动发起的一条消息。
     *
     * @param to_user_id
     * @param message
     * @param QoS
     * @param typeu
     * @return
     * @throws Exception
     */
    public static void sendMessage(String to_user_id, String message, boolean QoS, int typeu
            , SendResultObserver sendResultObserver) throws Exception {
        MessageHelper.sendMessage(to_user_id, message, QoS, null, typeu, sendResultObserver);
    }

    /**
     * 由服务端主动发起的一条消息。
     *
     * @param to_user_id
     * @param message
     * @param QoS
     * @param fingerPrint        当本参数为null时，将自动生成消息指纹码，否则使用参数指定的指纹码
     * @param typeu
     * @param sendResultObserver 指令发送结果观察者（因为通信底层netty是异步通知数据发送结果的）
     * @return
     * @throws Exception
     * @see SendResultObserver
     */
    public static void sendMessage(String to_user_id, String message, boolean QoS, String fingerPrint, int typeu
            , final SendResultObserver sendResultObserver) throws Exception {
        final Protocal p = ProtocalFactory.createCommonData(message, "0", to_user_id, QoS, fingerPrint, typeu);
        if (message != null && message.length() > 0) {
            // netty是异步通知数据发送结果的
            MBObserver resultObserver = new MBObserver() {
                @Override
                public void update(boolean sucess, Object extraObj) {
                    if (sendResultObserver != null)
                        sendResultObserver.update(sucess, p);
                }
            };

            GlobalSendHelper.sendDataS2C(ChatServerLauncher.getInstance().getServerCoreHandler().getBridgeProcessor(), p, resultObserver);
        } else {
            log.error("[RainbowChat]message为null或length<=0，请检查参数.");

            if (sendResultObserver != null)
                sendResultObserver.update(false, p);
        }
    }

    /**
     * 消息发送结果封装类。
     */
    public static interface SendResultObserver {
//		// 发送结果：true表示成功发出，否则发出失败
//		private boolean code = false;
//		// 发送内容：返回本次发送的完整协议包内容（只是方便调用者后绪 使用，不是必须要用的）。
//		private Protocal p;
//
//		public SendResultObserver(boolean code, Protocal p)
//		{
//			this.code = code;
//			this.p = p;
//		}
//
//		public boolean isCode()
//		{
//			return code;
//		}
//
//		public Protocal getP()
//		{
//			return p;
//		}

        /**
         * 发送指令完成后，通过此方法来通知异步结果的观察者。
         *
         * @param code 指令发送结果：true表示成功发出，否则发出失败
         * @param p    指令发送内容：返回本次发送的完整协议包内容（只是方便调用者后绪 使用，不是必须要用的）
         */
        public void update(boolean code, Protocal p);
    }

}
